home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_570 / gadtoolsbox / source / source.lha / Button.c < prev    next >
C/C++ Source or Header  |  1991-11-04  |  14KB  |  426 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   Button.c
  4. *   Copyright       :   © Copyright 1991 Jaba Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   01-Oct-91
  7. *   Current version :   1.00
  8. *   Translator      :   DICE v2.6
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   01-Oct-91     1.00            Button editor.
  15. *
  16. *-- REV_END --*/
  17.  
  18. #include "GTEd.h"
  19. #include "Protos.h"
  20.  
  21. /*
  22.  * --- External referenced data
  23.  */
  24. extern ULONG                Class;
  25. extern UWORD                Code;
  26. extern struct Gadget       *Object;
  27. extern APTR                 MainVisualInfo;
  28. extern struct TextAttr      Topaz80;
  29. extern struct Screen       *MainScreen;
  30. extern struct Window       *MainWindow;
  31. extern UWORD                ngFlags;
  32. extern WORD                 ngLeft, ngTop, ngWidth, ngHeight;
  33. extern UBYTE               *PlaceList[];
  34. extern UWORD                PlaceFlags[];
  35. extern struct ExtGadgetList Gadgets;
  36. extern struct MemoryChain  *Chain;
  37. extern BOOL                 Saved;
  38.  
  39. /*
  40.  * --- Gadget ID's
  41.  */
  42. #define GD_TEXT             0
  43. #define GD_LABEL            1
  44. #define GD_UNDERSCORE       2
  45. #define GD_DISABLED         3
  46. #define GD_TEXTPLACE        4
  47. #define GD_OK               5
  48. #define GD_CANCEL           6
  49.  
  50. /*
  51.  * --- Module data
  52.  */
  53. struct Window              *eb_Wnd    = NULL;
  54. struct Gadget              *eb_GList  = NULL;
  55. struct Gadget              *eb_Gadgets[5];
  56. BOOL                        eb_Score = FALSE, eb_Disabled = FALSE;
  57. WORD                        eb_Zoom[4];
  58.  
  59. struct TagItem              eb_nwTags[] = {
  60.     WA_Left,                0l,
  61.     WA_Top,                 0l,
  62.     WA_Width,               0l,
  63.     WA_Height,              0l,
  64.     WA_IDCMP,               IDCMP_CLOSEWINDOW | CYCLEIDCMP | BUTTONIDCMP | CHECKBOXIDCMP | IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY,
  65.     WA_Flags,               WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  66.     WA_Gadgets,             0l,
  67.     WA_Title,               "Edit BUTTON gadget:",
  68.     WA_AutoAdjust,          TRUE,
  69.     WA_Zoom,                (Tag)eb_Zoom,
  70.     WA_CustomScreen,        0l,
  71.     TAG_DONE };
  72.  
  73. /*
  74.  * --- Create the button gadget.
  75.  */
  76. long MakeButton( void )
  77. {
  78.     struct ExtNewGadget *eng  = 0l;
  79.     struct TagItem      *tags = 0l;
  80.  
  81.     if ( eng = AllocItem( Chain, (long)sizeof( struct ExtNewGadget ), MEMF_PUBLIC )) {
  82.         if ( tags = MakeTagList( 1l )) {
  83.  
  84.             eng->en_NumTags = 1l;
  85.             eng->en_Tags = tags;
  86.  
  87.             ChangeButton( eng );
  88.  
  89.             RemoveAllGadgets();
  90.  
  91.             AddTail(( struct List * )&Gadgets, ( struct Node * )eng );
  92.  
  93.             Renumber();
  94.  
  95.             if ( RemakeAllGadgets())
  96.                 return TRUE;
  97.  
  98.             Remove(( struct Node * )eng);
  99.         }
  100.     }
  101.  
  102.     MyRequest( "Ahem....", "CONTINUE", "Out of memory !" );
  103.  
  104.     if ( tags )         FreeTagList( tags, 1l );
  105.     if ( eng  )         FreeItem( Chain, eng, (long)sizeof( struct ExtNewGadget ));
  106.  
  107.     return FALSE;
  108. }
  109.  
  110. /*
  111.  * --- Change the button gadget.
  112.  */
  113. void ChangeButton( struct ExtNewGadget *eng )
  114. {
  115.     struct TagItem      *tags;
  116.     UBYTE               *slab, *text, tn = 0;
  117.  
  118.     tags = eng->en_Tags;
  119.  
  120.     slab = (( struct StringInfo * )eb_Gadgets[ GD_LABEL ]->SpecialInfo )->Buffer;
  121.     text = (( struct StringInfo * )eb_Gadgets[ GD_TEXT  ]->SpecialInfo )->Buffer;
  122.  
  123.     eng->en_NewGadget.ng_LeftEdge   =   ngLeft;
  124.     eng->en_NewGadget.ng_TopEdge    =   ngTop;
  125.     eng->en_NewGadget.ng_Width      =   ngWidth;
  126.     eng->en_NewGadget.ng_Height     =   ngHeight;
  127.  
  128.     if ( strncmp( slab, "Gadget", 6) && strlen( slab )) {
  129.         strcpy( &eng->en_SourceLabel[0], slab );
  130.         eng->en_SpecialFlags |= EGF_USERLABEL;
  131.     } else
  132.         eng->en_SpecialFlags = 0l;
  133.  
  134.     if ( strlen( text )) {
  135.         strcpy( &eng->en_GadgetText[0], text );
  136.         eng->en_NewGadget.ng_GadgetText = &eng->en_GadgetText[0];
  137.         eng->en_NewGadget.ng_Flags      = ngFlags;
  138.     } else {
  139.         eng->en_NewGadget.ng_GadgetText = 0l;
  140.         eng->en_NewGadget.ng_Flags      = 0;
  141.     }
  142.  
  143.     eng->en_Kind    = BUTTON_KIND;
  144.  
  145.     if ( eb_Score && strlen( text )) {
  146.         tags[ tn   ].ti_Tag  = GT_Underscore;
  147.         tags[ tn++ ].ti_Data = (Tag)'_';
  148.     }
  149.  
  150.     if ( eb_Disabled )
  151.         eng->en_SpecialFlags |= EGF_DISABLED;
  152.  
  153.     tags[ tn ].ti_Tag = TAG_DONE;
  154.  
  155.     Saved = FALSE;
  156. }
  157.  
  158. /*
  159.  * --- Open the EditButton requester.
  160.  */
  161. long EditButton( WORD x, WORD y, WORD x1, WORD y1, struct Gadget *edit )
  162. {
  163.     struct Gadget       *g;
  164.     struct ExtNewGadget *e;
  165.     struct NewGadget     ng;
  166.     BOOL                 running = TRUE, ok = FALSE;
  167.     WORD                 l, t, w, h, btop, bleft, gw, gh;
  168.     UBYTE               *label = 0l, *slabel = 0l, gbuf[10];
  169.     Tag                  place = 0l;
  170.     UWORD                flag  = PLACETEXT_IN, ID;
  171.  
  172.     if ( edit ) {
  173.         e = FindExtGad( edit );
  174.  
  175.         x  = e->en_NewGadget.ng_LeftEdge;
  176.         y  = e->en_NewGadget.ng_TopEdge;
  177.         gw = e->en_NewGadget.ng_Width;
  178.         gh = e->en_NewGadget.ng_Height;
  179.  
  180.         label  = &e->en_GadgetText[0];
  181.         slabel = &e->en_SourceLabel[0];
  182.  
  183.         flag = e->en_NewGadget.ng_Flags;
  184.  
  185.         if ( flag == PLACETEXT_IN    ) place = 0l;
  186.         if ( flag == PLACETEXT_LEFT  ) place = 1l;
  187.         if ( flag == PLACETEXT_RIGHT ) place = 2l;
  188.         if ( flag == PLACETEXT_ABOVE ) place = 3l;
  189.         if ( flag == PLACETEXT_BELOW ) place = 4l;
  190.  
  191.         eb_Score = MyTagInArray( GT_Underscore, e->en_Tags );
  192.  
  193.         if (( e->en_SpecialFlags & EGF_DISABLED ) == EGF_DISABLED )
  194.             eb_Disabled = TRUE;
  195.         else
  196.             eb_Disabled = FALSE;
  197.  
  198.     } else {
  199.         if ( x > x1 ) { gw = x; x = x1; x1 = gw; }
  200.         if ( y > y1 ) { gh = y; y = y1; y1 = gh; }
  201.  
  202.         gw = x1 - x + 1;
  203.         gh = y1 - y + 1;
  204.     }
  205.  
  206.     btop  = MainScreen->WBorTop + 1 + MainScreen->RastPort.TxHeight;
  207.     bleft = MainScreen->WBorLeft;
  208.  
  209.     w = bleft + MainScreen->WBorRight  + 300;
  210.     h = btop  + MainScreen->WBorBottom + 85;
  211.     l = (( MainScreen->Width  >> 1 ) - ( w >> 1 ));
  212.     t = (( MainScreen->Height >> 1 ) - ( h >> 1 ));
  213.  
  214.     eb_Zoom[0] = 0;
  215.     eb_Zoom[1] = btop;
  216.     eb_Zoom[2] = 200;
  217.     eb_Zoom[3] = btop;
  218.  
  219.     eb_nwTags[0 ].ti_Data = l;
  220.     eb_nwTags[1 ].ti_Data = t;
  221.     eb_nwTags[2 ].ti_Data = w;
  222.     eb_nwTags[3 ].ti_Data = h;
  223.     eb_nwTags[10].ti_Data = (Tag)MainScreen;
  224.  
  225.     if ( g = CreateContext( &eb_GList ))  {
  226.  
  227.         ng.ng_LeftEdge      =   bleft + 56;
  228.         ng.ng_TopEdge       =   btop + 4;
  229.         ng.ng_Width         =   236;
  230.         ng.ng_Height        =   12;
  231.         ng.ng_GadgetText    =   "_Text ";
  232.         ng.ng_TextAttr      =   &Topaz80;
  233.         ng.ng_GadgetID      =   GD_TEXT;
  234.         ng.ng_Flags         =   PLACETEXT_LEFT;
  235.         ng.ng_VisualInfo    =   MainVisualInfo;
  236.         ng.ng_UserData      =   0l;
  237.  
  238.         g = CreateGadget( STRING_KIND, g, &ng, GTST_String, (Tag)label, GTST_MaxChars, (Tag)GT_MAXLABELNAME + 1, GT_Underscore, (Tag)'_', TAG_DONE );
  239.  
  240.         SetStringGadget( g );
  241.  
  242.         eb_Gadgets[ GD_TEXT ] = g;
  243.  
  244.         ng.ng_TopEdge       =   btop + 20;
  245.         ng.ng_GadgetText    =   "_Label";
  246.         ng.ng_GadgetID      =   GD_LABEL;
  247.  
  248.         g = CreateGadget( STRING_KIND, g, &ng, GTST_String, (Tag)slabel, GTST_MaxChars, (Tag)GT_MAXLABEL + 1, GT_Underscore, (Tag)'_', TAG_DONE );
  249.  
  250.         SetStringGadget( g );
  251.  
  252.         eb_Gadgets[ GD_LABEL ] = g;
  253.  
  254.         ng.ng_LeftEdge      =   bleft + 96;
  255.         ng.ng_TopEdge       =   btop + 36;
  256.         ng.ng_GadgetText    =   "_Underscore";
  257.         ng.ng_GadgetID      =   GD_UNDERSCORE;
  258.  
  259.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, (Tag)eb_Score, GT_Underscore, (Tag)'_', TAG_DONE );
  260.  
  261.         eb_Gadgets[ GD_UNDERSCORE ] = g;
  262.  
  263.         ng.ng_LeftEdge      =   bleft + 266;
  264.         ng.ng_GadgetText    =   "_Disabled";
  265.         ng.ng_GadgetID      =   GD_DISABLED;
  266.  
  267.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, (Tag)eb_Disabled, GT_Underscore, (Tag)'_', TAG_DONE );
  268.  
  269.         eb_Gadgets[ GD_DISABLED ] = g;
  270.  
  271.         ng.ng_LeftEdge      =   bleft + 96;
  272.         ng.ng_TopEdge       =   btop + 51;
  273.         ng.ng_Width         =   196;
  274.         ng.ng_Height        =   13;
  275.         ng.ng_GadgetText    =   "Text _Place";
  276.         ng.ng_GadgetID      =   GD_TEXTPLACE;
  277.  
  278.         g = CreateGadget( CYCLE_KIND, g, &ng, GTCY_Labels, (Tag)PlaceList, GTCY_Active, place, GT_Underscore, (Tag)'_', TAG_DONE );
  279.  
  280.         eb_Gadgets[ GD_TEXTPLACE ] = g;
  281.  
  282.         ng.ng_LeftEdge      =   bleft + 8;
  283.         ng.ng_TopEdge       =   btop + 68;
  284.         ng.ng_Width         =   90;
  285.         ng.ng_GadgetText    =   "_OK";
  286.         ng.ng_Flags         =   PLACETEXT_IN;
  287.         ng.ng_GadgetID      =   GD_OK;
  288.  
  289.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, (Tag)'_', TAG_DONE );
  290.  
  291.         ng.ng_LeftEdge      =   bleft + 202;
  292.         ng.ng_GadgetText    =   "_CANCEL";
  293.         ng.ng_GadgetID      =   GD_CANCEL;
  294.  
  295.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, (Tag)'_', TAG_DONE );
  296.  
  297.         if ( g ) {
  298.  
  299.             eb_nwTags[6].ti_Data = (Tag)eb_GList;
  300.  
  301.             if ( eb_Wnd = OpenWindowTagList( 0l, eb_nwTags )) {
  302.  
  303.                 eb_Zoom[0] = l;
  304.                 eb_Zoom[1] = t;
  305.                 eb_Zoom[2] = w;
  306.                 eb_Zoom[3] = h;
  307.  
  308.                 GT_RefreshWindow( eb_Wnd, 0l );
  309.  
  310.                 do {
  311.                     WaitPort( eb_Wnd->UserPort );
  312.  
  313.                     while ( ReadIMsg( eb_Wnd )) {
  314.  
  315.                         switch ( Class ) {
  316.  
  317.                             case    IDCMP_REFRESHWINDOW:
  318.                                 GT_BeginRefresh( eb_Wnd );
  319.                                 GT_EndRefresh( eb_Wnd, TRUE );
  320.                                 break;
  321.  
  322.                             case    IDCMP_CLOSEWINDOW:
  323.                                 running = FALSE;
  324.                                 break;
  325.  
  326.                             case    IDCMP_GADGETUP:
  327.                                 switch( Object->GadgetID ) {
  328.  
  329.                                     case    GD_UNDERSCORE:
  330.                                         FlipFlop( 0l, 0l, 0l, &eb_Score );
  331.                                         break;
  332.  
  333.                                     case    GD_DISABLED:
  334.                                         FlipFlop( 0l, 0l, 0l, &eb_Disabled );
  335.                                         break;
  336.  
  337.                                     case    GD_TEXTPLACE:
  338.                                         if ( place++ == 4 )
  339.                                             place = 0;
  340.  
  341.                                         flag = PlaceFlags[ place ];
  342.                                         break;
  343.  
  344.                                     case    GD_OK:
  345.                                         Ok:
  346.                                         ok = TRUE;
  347.  
  348.                                     case    GD_CANCEL:
  349.                                         Cancel:
  350.                                         running = FALSE;
  351.                                         break;
  352.                                 }
  353.                                 break;
  354.  
  355.                             case    IDCMP_VANILLAKEY:
  356.                                 switch( Code ) {
  357.  
  358.                                     case    't':
  359.                                         ID = GD_TEXT;
  360.                                         goto Activate;
  361.  
  362.                                     case    'l':
  363.                                         ID = GD_LABEL;
  364.                                         goto Activate;
  365.  
  366.                                     case    'u':
  367.                                         FlipFlop( eb_Wnd, eb_Gadgets, GD_UNDERSCORE, &eb_Score );
  368.                                         break;
  369.  
  370.                                     case    'd':
  371.                                         FlipFlop( eb_Wnd, eb_Gadgets, GD_DISABLED, &eb_Disabled );
  372.                                         break;
  373.  
  374.                                     case    'p':
  375.                                         if ( place++ == 4 )
  376.                                             place = 0;
  377.  
  378.                                         flag = PlaceFlags[ place ];
  379.                                         GT_SetGadgetAttrs( eb_Gadgets[ GD_TEXTPLACE ], eb_Wnd, 0l, GTCY_Active, place, TAG_DONE );
  380.                                         break;
  381.  
  382.                                     case    'o':
  383.                                         goto Ok;
  384.  
  385.                                     case    'c':
  386.                                         goto Cancel;
  387.                                 }
  388.                                 break;
  389.                                 Activate:
  390.                                 ActivateGadget( eb_Gadgets[ ID ], eb_Wnd, 0l );
  391.                                 break;
  392.                         }
  393.                     }
  394.                 } while ( running );
  395.             }
  396.         }
  397.     }
  398.  
  399.     if ( ok) {
  400.         ngFlags     =   flag;
  401.         ngLeft      =   x;
  402.         ngTop       =   y;
  403.         ngWidth     =   gw;
  404.         ngHeight    =   gh;
  405.         if ( NOT edit )
  406.             ok = MakeButton();
  407.         else {
  408.             RemoveAllGadgets();
  409.             ChangeButton( e );
  410.             Renumber();
  411.             ok = RemakeAllGadgets();
  412.         }
  413.     } else if ( NOT edit )
  414.         Box( x, y, x1, y1 );
  415.  
  416.     if ( eb_Wnd )           CloseWindow( eb_Wnd );
  417.     if ( eb_GList )         FreeGadgets( eb_GList );
  418.  
  419.     eb_Wnd     = 0l;
  420.     eb_GList   =  0l;
  421.  
  422.     ClearMsgPort( MainWindow->UserPort );
  423.  
  424.     return( ok );
  425. }
  426.